<?php

/*
区别：　　
  1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。　
　2、接口中不可以声明成员变量（包括类静态变量），但是可以声明类常量。抽象类中可以声明各种类型成员变量，实现数据的封装。
　3、接口没有构造函数，抽象类可以有构造函数。
　4、接口中的方法默认都是public类型的，而抽象类中的方法可以使用private,protected,public来修饰。　
　5、一个类可以同时实现多个接口，但一个类只能继承于一个抽象类。

抽象类还是接口。　　
如果要创建一个模型，这个模型将由一些紧密相关的对象采用，就可以使用抽象类。
如果要创建将由一些不相关对象采用的功能，就使用接口。　
如果必须从多个来源继承行为，就使用接口。　　
如果知道所有类都会共享一个公共的行为实现，就使用抽象类，并在其中实现该行为


如果更详细一点我们可以对每一个都介绍一下
抽象类：是基于类来说，其本身就是类，只是一种特殊的类，不能直接实例，可以在类里定义方法，属性。
类似于模版，规范后让子类实现详细功能。

接口：主要基于方法的规范，有点像抽象类里的抽象方法，只是其相对于抽象方法来说，更加独立。
可让某个类通过组合多个方法来形成新的类。

抽象类与接口的不同点：
1、抽象类可以有属性、普通方法、抽象方法，但接口不能有属性、普通方法、可以有常量
2、抽象类内未必有抽象方法，但接口内一定会有“抽象”方法
3、语法上有不同
4、抽象类用abstract关键字在类前声明，且有class声明为类，接口是用interface来声明，但不能用class来声明，因为接口不是类。
5、抽象类的抽象方法一定要用abstract来声明，而接口则不需要
6、抽象类是用extends关键字让子类继承父类后，在子类实现详细的抽象方法。
而接口则是用implements让普通类在类里实现接口的详细方法，且接口可以一次性实现多个方法，用逗号分开各个接口就可

各自的特点：抽象类内未必有抽象方法，但有抽象方法的类，则必是抽象类抽象类内，
即便全是具体方法，也不能够实例化，只要新建类来继承后，实例继承类才可以接口可以让一个类一次性实现多个不同的方法
接口本身就是抽象的，但注意不是抽象类，因为接口不是类，只是其方法是抽象的。所以，其也是抽象的
*/

interface kk
{
    public function say();
}
abstract class a
{
    public function show()
    {
        echo '我是父类<br />';
    }
}
class b extends a implements kk
{
    public function say()
    {
        echo '我是继承A类,同时实现say接口的<br />';
    }
}
$b = new b();
$b->show();//我是父类
$b->say();//我是继承A类，同时实现say接口的